<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Acconeer API: /home/ai/jenkins/workspace/sw-main@2/doc/user_guides/rss/distance_peak.md Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Acconeer API
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('distance__peak_8md.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">/home/ai/jenkins/workspace/sw-main@2/doc/user_guides/rss/distance_peak.md</div>  </div>
</div><!--header-->
<div class="contents">
<a href="distance__peak_8md.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;# Distance Peak Detector {#distance_peak}</div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;The Distance Peak detector provides an api to get the distance to one or several objects in front of the sensor. It is implemented on top of the Envelope service and data from the Envelope service is further processed to find the peak of the signal.</div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;![](RSS_stack.png)</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;The figure below show envelope data with two objects in front of the sensor. The Distance Peak detector use algorithms to find the peaks of the two objects and return distance and amplitude to the client. Note that the absolute distance to an object is affected by integration of the sensor behind different material and lenses. For more details on the envelope data it is recommended to use our exploration tool. Check it out on [github, https://github.com/acconeer/acconeer-python-exploration](https://github.com/acconeer/acconeer-python-exploration), https://github.com/acconeer/acconeer-python-exploration.</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;![](envelope_profile_1.png)</div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;</div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;Acconeer provides an example of how to use the envelope service: example_detector_distance_peak.c</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;## Initializing the System</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;The Radar System Software (RSS) must be activated before any other calls are done. The activation requires a pointer to an acc_hal_t  struct which contains information on the hardware integration and function pointers to hardware driver functions that are needed by RSS. See chapter 4 in the document “HAL  Integration User Guide” for more information on how to integrate to the driver layer and populate the hal struct.</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;In Acconeer’s example integration towards STM32 and the drivers generated by the STM32Cube tool, there is a function acc_hal_integration_get_implementation to obtain the hal struct.</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;```c</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;acc_hal_t hal = acc_hal_integration_get_implementation();</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;if (!acc_rss_activate(&amp;hal))</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;{</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;   /* Handle error */</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;}</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;```</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;The corresponding code looks slightly different in software packages for the Raspberry Pi and other software packages from Acconeer where peripheral drivers for the host are included. The driver layer is first initialized by calling acc_driver_hal_init. The hal struct is then obtained with the function acc_driver_hal_get_implementation.</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;```c</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;if (!acc_driver_hal_init())</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;{</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;   /* Handle error */</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;}</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;acc_hal_t hal = acc_driver_hal_get_implementation();</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;if (!acc_rss_activate(&amp;hal))</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;{</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;   /* Handle error */</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;}</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;```</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;# Configuring the Distance Peak Detector</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;To use the Distance Peak Detector, first a configuration must be created. To create a configuration, call the acc_detector_distance_peak_configuration_create function which will create a configuration and return it.</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;```c</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;acc_detector_distance_peak_configuration_t distance_configuration;</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;distance_configuration = acc_detector_distance_peak_configuration_create();</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;```</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;A newly created configuration is populated with default parameters and can be used directly to create the detector by calling the acc_detector_distance_peak_create function. A more common scenario is to first modify some of the configuration parameters to better fit the application.</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;## Setting Sweep Parameters</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;The base configuration parameters determine the sensor id and how the sweep data will be generated in the sensor. The base configuration parameters are common to all services and are also possible to set in the Distance Peak detector. Like other configuration parameters, the sweep parameters have reasonable default values, but in most applications, it is necessary to modify at least some of them. To do this we must first obtain a base configuration handle.</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;```c</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;acc_base_configuration_t base_configuration;</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;base_configuration = acc_detector_distance_peak_get_base_configuration(distance_configuration);</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;if (base_configuration == NULL) {</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160; /* Handle error */</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;}</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;```</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;Using the base configuration handle, we can use functions to set individual configuration parameters such as the sweep range and frequency.</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;```c</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;// Set sweep start and length</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;acc_base_configuration_requested_start_set(base_configuration, 0.2);</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;acc_base_configuration_requested_length_set(base_configuration, 0.4);</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;```</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;See acc_detector_distance_peak.h and acc_base_configuration.h for a more complete explanation of the configuration parameters.</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;### Profiles</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;The services and detectors support profiles with different configuration of emission in the sensor. The different profiles provide an option to configure the wavelet length and optimize on either depth resolution or radar loop gain. More information regarding profiles can be read in the [sensor introduction document](https://acconeer-python-exploration.readthedocs.io/en/latest/sensor_introduction.html).</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;![](fig_distance_resolution.png)</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;The figure above shows the envelope signal of the same objects with two different profiles, one with short wavelet and one with longer.</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;The distance peak detector supports 5 different profiles which are defined in acc_service.h. Profile 1 has the shortest wavelet and should be used in applications which aim to see multiple objects or with short distance to the object. Profiles with higher numbers have longer wavelet and are more suitable to use in applications which aim to see objects with weak reflection or objects further away from the sensor. The highest profiles, 4 and 5, are optimized for maximum radar loop gain which leads to lower precision in the distance estimate.</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;Profiles can be configured by the application by using a set function in the detector api. The default profile is ACC_SERVICE_PROFILE_2.</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;```c</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;void acc_detector_distance_peak_service_profile_set(acc_detector_distance_peak_configuration_t configuration,</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;                                                    acc_service_profile_t                      service_profile);</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;```</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;## Absolute Amplitude</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;The amplitude values returned by the Distance Peak Detector constitute the difference between the reflection amplitude and the threshold. The acc_detector_distance_peak_set_absolute_amplitude function can be called to configure the Distance Peak Detector to return absolute amplitude values.</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;```c</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;acc_detector_distance_peak_status_t detector_status;</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;acc_detector_distance_peak_configuration_t distance_configuration;</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;distance_configuration = acc_detector_distance_peak_configuration_create();</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;acc_detector_distance_peak_set_absolute_amplitude(distance_configuration, true);</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;```</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;## Adjusting the Running Average for Better Accuracy</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;The range and accuracy of distance measurements can be improved when running the detector using an average of multiple sweeps. This procedure may be controlled by calling the function acc_detector_distance_peak_running_average_factor_set. By setting the “factor” parameter to a value between 0-1 where 0 means that averaging is disabled. A factor 1 means that the most recent sweep has no effect on the result, which will result in that the first sweep is forever received as the result.</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;The current default value for this setting is 0.7. When measuring objects in motion this value may be decreased. To improve SNR for static objects the running average factor could be increased to a value closer to 1.</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;```c</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;acc_detector_distance_peak_configuration_t distance_configuration;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;float factor = 0.9f;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;distance_configuration = acc_detector_distance_peak_configuration_create();</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;acc_detector_distance_peak_running_average_factor_set(distance_configuration, factor);</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;```</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;## Threshold Mode</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;## Fixed Threshold Mode</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;In fixed threshold mode, you can specify the minimum amplitude level to detect. Any object reflections with an amplitude below the minimum level, will be ignored by the detector. To configure the Distance Peak Detector to operate in fixed threshold mode, call the acc_detector_distance_peak_set_threshold_mode_fixed function.</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;```c</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;acc_detector_distance_peak_status_t detector_status;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;acc_detector_distance_peak_configuration_t distance_configuration;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;distance_configuration = acc_detector_distance_peak_configuration_create();</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;detector_status = acc_distance_set_detector_threshold_mode_fixed(distance_configuration, FIXED_THRESHOLD_VALUE);</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;```</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;## Stationary Clutter Threshold Mode</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;The client can choose to use a fixed threshold as described above or use the “stationary clutter estimated threshold”. In “stationary clutter estimated threshold” mode, first the detector records background reflections from stationary objects in the environment surrounding the sensor. A threshold varying with distance is then calculated, so that the amplitude of the reflections from the stationary objects will be located below the threshold level at the distances where the objects are located. At distances with no stationary clutter, the threshold level will be lower. To set up a detector in this mode call the acc_detector_distance_peak_threshold_estimation_update function.</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;You are recommended to use at least 50 updates with background reflections containing stationary clutter before using the Distance Peak Detector.</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;A new threshold estimation should be performed if significant changes were made in the sensor’s surrounding environment. To reset the Distance Peak Detector to empty state, please call the acc_detector_distance_peak_threshold_estimation_reset function. Then update the Distance Peak Detector for the new environment using the acc_detector_distance_peak_threshold_estimation_update function.</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;```c</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;acc_detector_distance_peak_status_t detector_status;</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;detector_status = acc_detector_distance_peak_threshold_estimation_update(distance_configuration, 100, metadata.start_m, metadata.start_m + metadata.length_m);</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;```</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;It is possible to control the sensitivity and false detection rate of the Distance Peak Detector in estimated threshold mode. With high sensitivity, the detector is more likely to make false detections, e.g. interpret noise as an object. At the same time, the number of missed detections is low. With low sensitivity, the number of missed detections is likely to increase, whereas false detections are likely to decrease.</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;The sensitivity of the detector is set when calling the acc_detector_distance_peak_set_sensitivity function. This function takes a sensitivity parameter in the range between 0 and 1, where the 0 represents the lowest sensitivity and 1 the highest. The function is optional but must be called before before activating the detector.</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;# Measure Distances</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;##  Creating and Activating the Distance Peak Detector</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;After the detector configuration has been prepared and populated with desired configuration parameters, the actual Distance Peak instance must be created. During the creation step all configuration parameters are validated and the resources needed by RSS are reserved. This means that if the creation step is successful, we can be sure that it is possible to activate the detector and get data from the sensor (unless there is some unexpected hardware error).</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;```c</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;acc_detector_distance_peak_handle_t handle = acc_detector_distance_peak_create(distance_configuration);</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;```</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;When the service is created, it is possible to fetch metadata from the detector</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;```c</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;acc_detector_distance_peak_metadata_t   metadata;</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;acc_detector_distance_peak_get_metadata(handle, &amp;metadata);</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;float start_m = metadata.start_m;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;float end_m = metadata.start_m + metadata.length_m;</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;```</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;To activate the detector call the acc_detector_distance_peak_activate function. Now the detector is producing detector data which might be retrieved by calling the acc_detector_distance_peak_get_next function.</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;```c</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;detector_status = acc_detector_distance_peak_activate(handle);</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;if (detector_status != ACC_DETECTOR_DISTANCE_PEAK_STATUS_SUCCESS) {</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;/* Handle error */</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;}</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;```</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;## Getting Detection Results</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;When the detector has been created and activated the detections results may be retrieved by calling the acc_detector_distance_peak_get_next function.</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;```c</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;acc_detector_distance_peak_configuration_t distance_configuration;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;acc_detector_distance_peak_handle_t        handle;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;acc_detector_distance_peak_status_t        detector_status;</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;uint_fast16_t                              reflection_count = 10;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;acc_detector_distance_peak_reflection_t    reflections[reflection_count];</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;distance_configuration = acc_detector_distance_peak_configuration_create();</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;handle = acc_detector_distance_peak_create(distance_configuration);</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;detector_status = acc_detector_distance_peak_activate(handle);</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;detector_status = acc_detector_distance_peak_get_next(handle, reflections, &amp;reflection_count, &amp;result_info);</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;```</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;To get the actual distances, we must start by allocating memory for an array of type acc_detector_distance_peak_reflection_t, for storing distance estimations. In the example above, this array is allocated on the stack. Then we can call acc_detector_distance_peak_get_next to fill the array with distances and amplitudes for such reflections, which have been detected as objects by the Distance Peak Detector.</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;# Deactivating and Destroying the Distance Peak Detector</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;To release the memory resources allocated by the Distance Peak Detector, please call the acc_detector_distance_peak_deactivate function followed by the acc_detector_distance_peak_destroy function and finally by calling the acc_detector_distance_peak_configuration_destroy function. Do this when you have reached the point where you do not need to use the detector anymore.</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;```c</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;detector_status = acc_detector_distance_peak_deactivate(handle);</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;acc_detector_distance_peak_destroy(&amp;handle);</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;acc_detector_distance_peak_configuration_destroy(&amp;distance_configuration);</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;```</div></div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="distance__peak_8md.html">distance_peak.md</a></li>
    <li class="footer">Generated on Mon Dec 2 2019 09:40:46 for Acconeer API by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>
